查看原文
其他

几行Python代码教你zip打包

点击关注👉 Python架构师 2024-02-12


码农一方面是码代码,另一方面是布署服务,传到服务器时,文件数据较多时,直接通过文件传输概率性会丢失文件,最好是先压成zip包,再传输。但是,zip包中的文件经常要修改,每次解压,修改再压缩,感觉自己笨笨的,为啥不用脚本来呢。


01 准备


有时我们不想去手动一个个去操作,然后傻等他打包完,python依赖库zipfile很方便地帮助我们封装了解压压缩,shutil用于文件目录处理,方法类似于linux命令。


1、安装


pip install zipfile


2、环境准备


以windows为例,基本不用准备,正常我们原来有一个zip包,其他类型的文件其实也是可以解压的,比如war。


👉点击领取Python面试题手册

Python从入门到进阶知识手册


02 解压并修改


1、解压 从zip目录下的 r'./zip/ereport_1.11.0.zip',解压到同名目录r'./zip/ereport_1.11.0'。


path = r'./zip/ereport_1.11.0.zip' dist_dir =r'./zip/ereport_1.11.0'def unzip(path,dist_dir): r = zipfile.is_zipfile(path) if r: os.mkdir(dist_dir) fz = zipfile.ZipFile(path, 'r') for file in fz.namelist(): fz.extract(file, dist_dir) else: print('{} is not zip'.format(path))
    

2、删除目录 将zip包下的深层目录及子文件删除:


def dir_del(path): shutil.rmtree(path) print('{} del success'.format(path))
    

3、拷贝目录 再将外包的目录及子文件夹替换到该目录下,如果目录已经存在,先删除再拷贝。


def dir_copy(src,dst): if os.path.exists(dst): dir_del(dst) shutil.copytree(src,dst)

如果不删除,直接拷贝,会报错:


File "F:\python36\lib\os.py", line 220, in makedirs mkdir(name, mode)FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: '\\zip\\1.11.0.20220408162018_CentOS\\bin\\static'


03 压缩


全部改完后,再重新压缩,传入要压缩的目录和zip包的名称:


def zip(dist_dir,dist_name): zip_name = os.path.join(dist_dir,dist_name) z = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) time.sleep(2) for dirpath, dirnames, filenames in os.walk(dist_dir): fpath = dirpath.replace(dist_dir, '') fpath = fpath and fpath + os.sep or '' for filename in filenames: z.write(os.path.join(dirpath, filename), fpath + filename) print('{}压缩中...'.format(filename)) print('{}压缩成功'.format(zip_name)) z.close()

不一定是zip类型,也可以是war包。‘压缩中...’的日志打印只是为了让程序看起来一直在跑,可以删掉。因为文件很多时,压缩起来是很慢的,1G的文件要压2分钟左右。


04 结论


简单的事情重复做,重复的事情坚持做,终将被替代。人类的进步,主要靠懒人。



程序员技术交流群


扫码进群记得备注:城市、昵称和技术方向


 阅读更多


  1. 【Pycharm教程】在 PyCharm 中使用高级 Vagrant 功能
  2. MySQL命令行工具的配置和使用
  3. 【Pycharm教程】PyCharm使用 SSH 创建基于 WSL 的远程解释器
继续滑动看下一个

几行Python代码教你zip打包

点击关注👉 Python架构师
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存